From bef1f477cbd7486d53b34bb1b592e75f52470e4d Mon Sep 17 00:00:00 2001 From: Siddharth Agarwal Date: Sun, 30 Jul 2017 18:15:24 -0700 Subject: [PATCH] new: fix hgignore for real There was an attempt to fix hgignore in #4158, but unfortunately the fix was incorrect -- hgignore glob syntax is not in fact identical to gitignore syntax. To get rooted ignores in Mercurial we must use the regex-based syntax, so we have no choice but to define a separate set of ignores. --- src/cargo/ops/cargo_new.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/cargo/ops/cargo_new.rs b/src/cargo/ops/cargo_new.rs index 31c308bb9..6320498f6 100644 --- a/src/cargo/ops/cargo_new.rs +++ b/src/cargo/ops/cargo_new.rs @@ -390,9 +390,16 @@ fn mk(config: &Config, opts: &MkOptions) -> CargoResult<()> { let path = opts.path; let name = opts.name; let cfg = global_config(config)?; + // Please ensure that ignore and hgignore are in sync. let ignore = ["/target/\n", "**/*.rs.bk\n", if !opts.bin { "Cargo.lock\n" } else { "" }] .concat(); + // Mercurial glob ignores can't be rooted, so just sticking a 'syntax: glob' at the top of the + // file will exclude too much. Instead, use regexp-based ignores. See 'hg help ignore' for + // more. + let hgignore = ["^target/\n", "glob:*.rs.bk\n", + if !opts.bin { "glob:Cargo.lock\n" } else { "" }] + .concat(); let in_existing_vcs_repo = existing_vcs_repo(path.parent().unwrap(), config.cwd()); let vcs = match (opts.version_control, cfg.version_control, in_existing_vcs_repo) { @@ -412,8 +419,7 @@ fn mk(config: &Config, opts: &MkOptions) -> CargoResult<()> { if !fs::metadata(&path.join(".hg")).is_ok() { HgRepo::init(path, config.cwd())?; } - let ignore = format!("syntax: glob\n{}", ignore); - paths::append(&path.join(".hgignore"), ignore.as_bytes())?; + paths::append(&path.join(".hgignore"), hgignore.as_bytes())?; }, VersionControl::Pijul => { if !fs::metadata(&path.join(".pijul")).is_ok() { -- 2.30.2